
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>如何设计一个本地缓存 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>如何设计一个本地缓存 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">本地缓存的核心思想是什么？与分布式缓存相比，它的主要优势体现在哪些方面？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">本地缓存的核心思想是“空间换时间”，通过将数据预先加载到本地内存中，避免每次都请求外部数据源。相比分布式缓存，其优势在于速度更快、实现更简单，并且不需要考虑网络传输的延迟和分布式一致性的问题。</div>
          </div>
          <div class="card-source">来源: 本地缓存的基本概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">使用本地缓存会带来哪些主要的局限性或挑战？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要的局限性有三点：1. 内存消耗，缓存数据量需要谨慎控制，否则可能导致内存溢出；2. 数据一致性问题，当外部数据源更新时，本地缓存可能变得过时；3. 适用场景受限，主要适用于单机环境，在分布式系统中需要更复杂的缓存一致性机制。</div>
          </div>
          <div class="card-source">来源: 本地缓存的局限性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">除了使用简单的Map，文档中还提到了哪两种更高级的本地缓存实现方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到了两种更高级的实现方式：1. LinkedHashMap，通过设置accessOrder参数和覆盖removeEldestEntry()方法可以实现一个简单的LRU缓存；2. 缓存框架（如Ehcache, Caffeine），它们提供了更丰富的功能，如基于时间或大小的淘汰策略和缓存监控。</div>
          </div>
          <div class="card-source">来源: 本地缓存的实现方式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">LRU（最近最少使用）淘汰策略基于什么假设？它可能会导致什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">LRU策略基于的假设是：如果一个数据在最近没有被使用，那么它在未来也不太可能被使用。这种策略可能会导致“缓存污染”问题，即大量频繁访问的临时数据可能会迅速填满缓存，从而淘汰掉真正重要的热点数据。</div>
          </div>
          <div class="card-source">来源: 缓存的淘汰策略 - 1. LRU（Least Recently Used） - 最近最少使用策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">LFU（最少使用频率）淘汰策略的核心思想是什么？它更适用于哪种场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">LFU策略的核心思想是：如果一个数据在过去被频繁使用，那么它在未来也有较大可能继续被使用，因此它会移除访问频率最低的数据。它适用于访问频率相对稳定且变化较少的场景，例如用户个性化推荐缓存。</div>
          </div>
          <div class="card-source">来源: 缓存的淘汰策略 - 2. LFU（Least Frequently Used） - 最少使用频率策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">ARC（自适应替换缓存）策略是如何结合LRU和LFU思想的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ARC策略通过维护两个LRU队列来结合LRU和LFU的思想：一个队列用于存储最近被访问的数据（体现LRU），另一个用于存储频繁访问的数据（体现LFU）。ARC能够通过动态调整这两个队列的大小，自适应不同的访问模式。</div>
          </div>
          <div class="card-source">来源: 缓存的淘汰策略 - 4. ARC（Adaptive Replacement Cache） - 自适应替换缓存策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是缓存一致性？文档中提到了哪三种不同级别的一致性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">缓存一致性是指缓存中的数据和源数据（如数据库）保持同步的状态。文档中提到了三种级别的一致性：1. 强一致性（数据始终同步）；2. 弱一致性（允许短时间不一致）；3. 最终一致性（数据最终会达到一致，是分布式系统常见选择）。</div>
          </div>
          <div class="card-source">来源: 缓存一致性 - 1. 缓存一致性的基本概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请解释“写直达（Write-Through）”和“写回（Write-Behind）”这两种缓存一致性策略的区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“写直达”策略在写入数据时，会先写入缓存，再同步写入底层存储，能保证数据同步但写入延迟较高。“写回”策略则是先将数据写入缓存，再异步地写入底层存储，这可以提升写入性能，但存在因缓存数据未及时持久化而丢失的风险。</div>
          </div>
          <div class="card-source">来源: 缓存一致性 - 3. 缓存一致性的常见策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在缓存监控中，“缓存命中率”是一个关键指标，它反映了什么？低命中率可能意味着什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“缓存命中率”是衡量缓存有效性的重要指标，表示从缓存中成功读取数据的请求比例。高命中率说明缓存策略合理。低命中率可能意味着缓存数据不够新鲜、没有缓存正确的热点数据，或者缓存容量不足。</div>
          </div>
          <div class="card-source">来源: 缓存的监控与管理 - 2. 监控的关键指标</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
